const mongoose = require("mongoose");
mongoose.set('strictQuery', true);

// 连接数据库
function mgsConect(config) {
  mongoose.disconnect()
  mongoose.connect(config.mongoConfig.host + "/" + config.mongoConfig.db, { useNewUrlParser: true }, function (err) {
    if (err) {
      console.log(err)
      console.log("Mongodb数据库连接失败");
    } else {
      console.log("Mongodb数据库连接成功");
    }
  });
}

// 设置当前集合
function getCollection(model) {
  var Collection = null
  if (model == 'user') Collection = require("./models/user")
  if (model == 'mark') Collection = require("./models/mark")
  if (model == 'buddy') Collection = require("./models/buddy")
  return Collection
}
/**
 * 插入数据
 */
// 插入多条数据：单个数据可以是json对象，多个数据放在数组中；
async function insertMany(collection,aryjson) {
  let r = getCollection(collection).insertMany(aryjson).catch(err=>{
    return err
  })
  return r
}
/**
 * 删除数据
 */
// 删除满足条件的一条数据：
async function deleteOne(collection,filter) {
  let r = getCollection(collection).deleteOne(filter).catch(err=>{
    return err
  })
  return r
}
// 删除满足条件的所有数据：
async function deleteMany(collection,filter) {
  let r = getCollection(collection).deleteMany(filter).catch(err=>{
    return err
  })
  return r
}
/**
 * 修改数据
 */
// 修改满足条件的一条数据：
async function updateOne(collection, filter, updatejson) {
  let r = getCollection(collection).updateOne(filter, updatejson).catch(err=>{
    return err
  })
  return r
}
// 修改满足条件的多条数据：
async function updateMany(collection, filter, updatejson) {
  let r = getCollection(collection).updateMany(filter, updatejson).catch(err=>{
    return err
  })
  return r
}
/**
 * 查询数据
 */
// 查找，排序，分页
async function find(collection, filter, field, sort, paging) {
  let indexPage = Number(paging.index) - 1 || 0
  let pageSize = Number(paging.size) || 0
  let r = getCollection(collection).find(filter,field).sort(sort).limit(pageSize).skip(indexPage * pageSize).catch(err=>{
    return err
  })
  return r
}
// 获取满足条件的数据总个数
async function count(collection, filter) {
  let r = getCollection(collection).countDocuments(filter).catch(err=>{
    return err
  })
  return r
}

// 按openid查询朋友列表
async function getBuddysByOid(oid) {
  let r = getCollection('buddy').aggregate([
    {
      $lookup:{
        from:'users',
        localField:'buddyOpenId',
        foreignField:'openId',
        as:'userinfo',
      },
    },
    {   
	    $unwind:"$userinfo" 
    },
    {  
      $project:{ 
        openId : 1,
        buddyOpenId : 1,
        createTime: 1,
        buddyName :"$userinfo.name",
        buddyAvatar :"$userinfo.avatar",
      }
    },
    { $match : {openId: oid} },
    { $sort : { createTime : -1} },
  ],(e)=>{
    return e
  })
  return r
}

// 按openid查询所有记录日期
async function getMarksDateByOid(oid) {
  let r = getCollection('mark').aggregate([
    { $match : { openId: oid, flag: {$gte: 1}} },
    { 
      $group: { 
        _id: { $substr: ["$markTime", 0, 10] },
        total: {$sum: 1} 
      }
    },
    {
      $project: {
        _id: 0,
        markDate: "$_id",
        total: 1,
      }
    },
    { $sort : { markDate : -1} },
  ]).catch(err=>{
    return err
  })
  return r
}

module.exports= {
  mgsConect,
  insertMany, deleteOne, deleteMany, updateOne, updateMany, find, count, 
  getBuddysByOid, getMarksDateByOid
}
